#ifndef ATOMIC_GENERATORS_H_JM_20120813
#define ATOMIC_GENERATORS_H_JM_20120813
/** @file AtomicGenerators.h
 * Generatory zakladnych stavebnych prvkov textovej podoby modelu vypoctu pre 
 * bobox. 
 **/

// ##
#include "BoxDescriptor.h"
// ## C++
#include <sstream>
#include <string>

namespace jm4bbx {

	extern std::string BOBOX_MODEL_LINE_END;

	struct ViaIdGenerator;

	/**
	 * Vygeneruje parameter s priradenim hodnoty pre definiciu boxu v textovom 
	 * modele vypoctu: meno_parametra=(hodnota_parametra),
	 * 
	 * @param paramName meno parametra v modele
	 * @param value hodnota parametra v modele
	 **/
	template<class T>
	std::string genBoxParam(const std::string& paramName, const T& value) {
			std::stringstream stream;
			stream << paramName << "=(" << value << "),";
			return stream.str();
	}

	/**
	 * Vygeneruje definiciu boxu pre textovy model vypoctu: 
	 * box:index_boxu[meno_boxu](parametre_boxu),
	 * 
	 * @param box popis generovaneho boxu 
	 **/
	std::string genBox(const BoxDescriptorPtr& box);

	/**
	 * Vygeneruje definiciu typu stlpcov pre definiciu spojenia boxov:
	 * typ(),typ()
	 * 
	 * @param types nazov typu stlpcu (napr. int alebo string)
	 * @param multiplicity nasobnost stlpca (resp. pocet stlpcov)
	 **/
	std::string genTypes(const std::string& types, int multiplicity = 1);

	/**
	 * Vygeneruje definiciu cesty medzi dvomi boxami (nazyvane via) pre textovy 
	 * model vypoctu: 
	 * via:index_spojenia[src_id_boxu:id_arc]{typy_stlpcov}{}(dst_id_boxu:id_arc),
	 * 
	 * @param gen generator id pre spojenia tak aby mali spojenia v model 
	 *		unikatne id
	 * @param fromId id zdrojovohe boxu
	 * @param fromCol id prveho zdrojoveho stlpca
	 * @param toId id cieloveho boxu
	 * @param roCol id prveho cieloveho stlpca
	 * @param types popis datovych typov prenasanych stlpcov
	 **/
	std::string genVia(ViaIdGenerator& gen, int fromId, int fromCol, int toId, 
		int toCol, const std::string& types) ;
	
} // namespace jm4bbx

#endif

